class Solution {
public:
    string minWindow(string s, string t) {
        int kinds = 0;
        int hash1[128] = {0};
        for(auto& e : t)
        {
            if(hash1[e]++ == 0) kinds++; //统计有效字符的种类，这里不是要求s中的字符个数和t中的字符个数一样，只有包含t就行了
        }
        if(t.size() > s.size()) return "";
        int hash2[128] = {0};
        int len = INT_MAX;
        int begin = -1;
        for(int left = 0, right = 0, cnt = 0; right < s.size(); right++)
        {
            char in = s[right];
            if(++hash2[in] == hash1[in]) cnt++;//s中的字符必须不少于t中的字符,但是不能大于，因为s中的正负有些t中没有
            while(cnt == kinds)
            {
                if(right - left + 1 < len)
                {
                    len = right - left + 1;
                    begin = left;
                    
                }
                char out = s[left];
                if(--hash2[out] < hash1[out]) cnt--;
                left++;

            }

        }
        if(begin == -1) return "";
        else return s.substr(begin, len);
    }
};
